{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d80e5185",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "#数据集\n",
    "data=np.array([[32, 31], [53, 68], [61, 62], [47, 71], [59, 87], [55, 78], [52, 79], [39, 59], [48, 75], [52, 71],\n",
    "                 [45, 55], [54, 82], [44, 62], [58, 75], [56, 81], [48, 60], [44, 82], [60, 97], [45, 48], [38, 56],\n",
    "                 [66, 83], [65, 118], [47, 57], [41, 51], [51, 75], [59, 74], [57, 95], [63, 95], [46, 79],\n",
    "                 [50, 83]])\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f38875b0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 32  31]\n",
      " [ 53  68]\n",
      " [ 61  62]\n",
      " [ 47  71]\n",
      " [ 59  87]\n",
      " [ 55  78]\n",
      " [ 52  79]\n",
      " [ 39  59]\n",
      " [ 48  75]\n",
      " [ 52  71]\n",
      " [ 45  55]\n",
      " [ 54  82]\n",
      " [ 44  62]\n",
      " [ 58  75]\n",
      " [ 56  81]\n",
      " [ 48  60]\n",
      " [ 44  82]\n",
      " [ 60  97]\n",
      " [ 45  48]\n",
      " [ 38  56]\n",
      " [ 66  83]\n",
      " [ 65 118]\n",
      " [ 47  57]\n",
      " [ 41  51]\n",
      " [ 51  75]\n",
      " [ 59  74]\n",
      " [ 57  95]\n",
      " [ 63  95]\n",
      " [ 46  79]\n",
      " [ 50  83]]\n"
     ]
    }
   ],
   "source": [
    "print(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0a64cc58",
   "metadata": {},
   "outputs": [],
   "source": [
    "x=data[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fc492b58",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[32 53 61 47 59 55 52 39 48 52 45 54 44 58 56 48 44 60 45 38 66 65 47 41\n",
      " 51 59 57 63 46 50]\n"
     ]
    }
   ],
   "source": [
    "print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "662ebf09",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 31  68  62  71  87  78  79  59  75  71  55  82  62  75  81  60  82  97\n",
      "  48  56  83 118  57  51  75  74  95  95  79  83]\n"
     ]
    }
   ],
   "source": [
    "y=data[:,1]\n",
    "print(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "df5c27d2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "w is:  1.4291279505571877\n",
      "b is:  0.02679237145547876\n",
      "cost is:  119.14974824837549\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8AElEQVR4nO3de3wU1f3/8fcmQAKYLCSSbKJcAmI1RG4iFNQCCojlZvtVUcRitf0i4AUvFfBSLlUQ2lKtVKhUq4KUekOFH2LwoUAVbJAQS4AiQkCUpLHAdxOUBEjm98eYDSG7ue/O7Ozr+XjkoZmZbE7OY8K+c85nznEZhmEIAADAoaKsbgAAAEAwEXYAAICjEXYAAICjEXYAAICjEXYAAICjEXYAAICjEXYAAICjEXYAAICjEXYAAICjEXYAQNKGDRvkcrn0+uuvW90UAE2MsAMAAByNsAMgbBiGoRMnTljdDABhhrADwBJvv/22unfvrpiYGHXu3FlPP/20Zs2aJZfL5bvG5XLprrvu0pIlS3TxxRcrJiZGL730kiRp9uzZ6tevnxISEhQfH6/evXvr+eef19l7G3fq1EkjR47UqlWr1L17d8XGxqpz58764x//6Lddp06d0iOPPKLU1FTFx8dryJAh2rNnj+/8b37zGzVr1kyHDh2q9rW33367EhMTVVJS0hRdBKCJuNj1HECorVu3TiNGjNCPfvQj3XvvvTp9+rR+97vf6T//+Y8OHDjgCywul0vnnXeeEhMTNX36dHk8HiUlJalbt276+c9/riuvvFIdOnSQJH3yySeaO3eupk+frl//+te+79WpUyedPn1a0dHRmjVrljwej1555RW98sor+u1vf6sHH3xQklmzM3jwYHXq1EmXX365xo0bp6KiIk2bNk0xMTHavXu3oqOjVVhYqA4dOujBBx/U448/7vs+R48e1fnnn6+77rpLCxYsCGFvAqiVAQAhdtlllxnt27c3SktLfceKi4uNxMRE48x/liQZbrfbOHr0aI2vV1ZWZpw6dcqYM2eOkZiYaJSXl/vOdezY0XC5XEZOTk6Vrxk6dKgRHx9vfPvtt4ZhGMaHH35oSDJ+/OMfV7nu1VdfNSQZW7Zs8R2bMGGCkZSUVKX98+fPN6Kiooy8vLy6dwSAkGAaC0BIffvtt/r000913XXXqUWLFr7j55xzjkaNGlXt+quuukpt27atdvyDDz7QkCFD5Ha7FR0drebNm+vXv/61jhw5osLCwirXduvWTT169KhyrGLkJjs7u8rx0aNHV/m8e/fukqSDBw/6jt17770qLCzUa6+9JkkqLy/X4sWLNWLECHXq1KkOvQAglAg7AELq2LFjMgxDycnJ1c75O5aSklLtWFZWloYNGyZJWrp0qT7++GNt3bpVjzzyiCRVK2L2eDzVXqPi2JEjR6ocT0xMrPJ5TExMtdfs1auXrrzySv3pT3+SJK1Zs0YHDhzQXXfdVe37ALBeM6sbACCytG3bVi6XS//5z3+qnSsoKKh27MyC5QorV65U8+bNtWbNGsXGxvqOv/XWW36/p7/XrTh2dripq3vuuUc33HCDsrOztWjRIl144YUaOnRog14LQHAxsgMgpFq3bq0+ffrorbfe0smTJ33Hjx8/rjVr1tTpNVwul5o1a6bo6GjfsRMnTmjZsmV+r9+5c6c+++yzKsdWrFihuLg49e7duwE/hfSTn/xEHTp00AMPPKD3339fkydP9hvMAFiPsAMg5ObMmaOvv/5a11xzjd566y298cYbGjJkiM4555w6BYYRI0bo+PHjGjdunNavX6+VK1fqyiuv9E05nS01NVWjR4/WX//6V61bt07jx4/X+vXr9eijj6pVq1YN+hmio6M1ZcoUbdiwQa1atdJtt93WoNcBEHyEHQAhN3z4cL3xxhs6cuSIxo4dq/vvv18/+clPNGbMGLVp06bWr7/qqqv0wgsvaMeOHRo1apQeeeQRXX/99Zo+fbrf63v27KmFCxfq97//vcaMGaOPP/5YCxcu1EMPPdSon2Ps2LGSpFtvvVVut7tRrwUgeFhnB4AtnDp1Sj179tR5552nzMzMJnvdTp06KSMjo85TZPXxzDPP6J577lFubq66devW5K8PoGlQoAzAEnfccYeGDh2qlJQUFRQUaMmSJdq9e7eefvppq5tWq+3btysvL09z5szRmDFjCDqAzRF2AFiiuLhYDz74oL755hs1b95cvXv31tq1azVkyBCrm1arn/zkJyooKNCVV16pJUuWWN0cALVgGgsAADgaBcoAAMDRCDsAAMDRCDsAAMDRKFCWuYnf4cOHFRcXxwqoAACECcMwVFxcrNTUVEVFBR6/IexIOnz4sNq3b291MwAAQAMcOnRI559/fsDzhB1JcXFxkszOio+P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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# --------------2. 定义损失函数--------------\n",
    "def compute_cost(w, b, data):\n",
    "    total_cost = 0\n",
    "    M = len(data)\n",
    "    # 逐点计算平方损失误差，然后求平均数\n",
    "    for i in range(M):\n",
    "        x = data[i, 0]\n",
    "        y = data[i, 1]\n",
    "        total_cost += (y - w * x - b) ** 2\n",
    "    return total_cost / M\n",
    " \n",
    "# --------------3. 定义模型的超参数------------\n",
    "alpha = 0.0001\n",
    "initial_w = 0\n",
    "initial_b = 0\n",
    "num_iter = 10\n",
    " \n",
    "# --------------4. 定义核心梯度下降算法函数-----\n",
    "def grad_desc(data, initial_w, initial_b, alpha, num_iter):\n",
    "    w = initial_w\n",
    "    b = initial_b\n",
    "    # 定义一个list保存所有的损失函数值，用来显示下降的过程\n",
    "    cost_list = []\n",
    "    for i in range(num_iter):\n",
    "        cost_list.append(compute_cost(w, b, data))\n",
    "        w, b = step_grad_desc(w, b, alpha, data)\n",
    "    return [w, b, cost_list]\n",
    " \n",
    "def step_grad_desc(current_w, current_b, alpha, data):\n",
    "    sum_grad_w = 0\n",
    "    sum_grad_b = 0\n",
    "    M = len(data)\n",
    "    # 对每个点，代入公式求和\n",
    "    for i in range(M):\n",
    "        x = data[i, 0]\n",
    "        y = data[i, 1]\n",
    "        sum_grad_w += (current_w * x + current_b - y) * x\n",
    "        sum_grad_b += current_w * x + current_b - y\n",
    "    # 用公式求当前梯度\n",
    "    grad_w = 2 / M * sum_grad_w\n",
    "    grad_b = 2 / M * sum_grad_b\n",
    "    # 梯度下降，更新当前的w和b\n",
    "    updated_w = current_w - alpha * grad_w\n",
    "    updated_b = current_b - alpha * grad_b\n",
    "    return updated_w, updated_b\n",
    " \n",
    "# ------------5. 测试：运行梯度下降算法计算最优的w和b-------\n",
    "w, b, cost_list = grad_desc( data, initial_w, initial_b, alpha, num_iter )\n",
    "print(\"w is: \", w)\n",
    "print(\"b is: \", b)\n",
    "cost = compute_cost(w, b, data)\n",
    "print(\"cost is: \", cost)\n",
    "plt.plot(cost_list)\n",
    "plt.show()\n",
    " \n",
    "# ------------6. 画出拟合曲线-------------------------\n",
    "plt.scatter(x, y)\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"y\")\n",
    "plt.title(\"graphy\")\n",
    "# 针对每一个x，计算出预测的y值\n",
    "pred_y = w * x + b\n",
    "plt.plot(x, pred_y, c='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "745ed9fa",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:yzk] *",
   "language": "python",
   "name": "conda-env-yzk-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
